package com.wx.gof.pattern.structural.facade;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 外观模式又叫门面模式，通过了一个统一的接口，用来访问子系统中的一群接口，使得子系统更易于使用
 * 描述:
 * 外观对象提供一个接口给应用程序使用，它负责各个子系统的协作组合，应用程序直接通过外观对象的接口来使用这些子系统协作完成的功能，
 * 不需要知道具体细节,门面模式的用意是为子系统提供一个集中化和简化的沟通管道,一个大系统可以有几个门面类
 * 适用场景:
 * 1.子系统越来越复杂,增加外观模式提供简单调用接口
 * 2.构建多层系统结构，利用外观对象作为每层入口，简化层间调用
 * 优点:
 * 1.简化调用过程，无需去知道子系统的一些细节
 * 2.减少系统依赖，松散耦合，松散了应用程序与子系统的关系，应用程序不与子系统接触，直接与外观对象接触
 * 3.更好的划分访问层次，对外的子系统全部都用外观对象去进行暴露
 * 缺点:
 * 1.增加子系统、子系统加入新的行为会引入风险，需要修改外观对象
 * 2.不符合开闭原子
 * 理解:
 * 应用程序-外观模式/门面模式(适合迪米特法则，最少知道原则，应用程序不与多个子系统直接交互，而是与外观对象交互，外观对象负责与多个子系统进行交互
 * 这里的交互是指引用、多个子系统组合使用、逻辑判断等等)
 * @Date 2018-12-07
 */
public class Application {
    public static void main(String[] args) {
        /**
         * 客户端不直接与子系统交互 通过外观对象去直接操作积分兑换礼物
         */
        PointsGift pointsGift = new PointsGift("T恤");
        GiftExchangeService giftExchangeService = new GiftExchangeService();
        giftExchangeService.giftExchange(pointsGift);
    }
}
